Template Method Pattern

Template ဆိုတာကတော့ ကျွန်တော်တို့တွေ ကြားနေကြပါ။ ပုံမှန် အားဖြင့် အရန်သင့်ရှိပြီးသားထဲကမှ လိုအပ်သည့် အပိုင်းလေးကိုပဲ ပြင်ပြီး သုံးတာပါ။ Template Method Pattern ကလည်း အဲလိုခပ်ဆင်ဆင်ပါပဲ။ Template Method Pattern က Behavioral Patterns တစ်ခုပါ။

အိမ်တစ်လုံး ဆောက်သည့် Class ကို ကြည့်ရအောင်။

အိမ်ကို တစ်ဆောက်မှာကတော့ House Builder ကနေ buildHouse function က ပဲ ဆောက်ပါလိမ့်မယ်။ ဒါပေမယ့် ဆောက်ပုံဆောက်နည်း က class ပေါ်မှာ မူတည်ပြီး ကွာသွားတယ်။ Code ကို ကြည့်ရအောင်။

HouseBuilder.java

abstract class HouseBuilder {
    final void buildHouse() {
        layFoundation();
        buildWalls();
        buildRoof();
        installDoors();
    }

    abstract void layFoundation();
    abstract void buildWalls();
    abstract void buildRoof();
    abstract void installDoors();
}

WoodenHouseBuilder.java

class WoodenHouseBuilder extends HouseBuilder {
    void layFoundation() {
        System.out.println("Laying wooden foundation");
    }

    void buildWalls() {
        System.out.println("Building wooden walls");
    }

    void buildRoof() {
        System.out.println("Building wooden roof");
    }

    void installDoors() {
        System.out.println("Installing wooden doors");
    }
}

BrickHouseBuilder.java

class BrickHouseBuilder extends HouseBuilder {
    void layFoundation() {
        System.out.println("Laying brick foundation");
    }

    void buildWalls() {
        System.out.println("Building brick walls");
    }

    void buildRoof() {
        System.out.println("Building brick roof");
    }

    void installDoors() {
        System.out.println("Installing brick doors");
    }
}

GlassHouseBuilder.java

class GlassHouseBuilder extends HouseBuilder {
    void layFoundation() {
        System.out.println("Laying glass foundation");
    }

    void buildWalls() {
        System.out.println("Building glass walls");
    }

    void buildRoof() {
        System.out.println("Building glass roof");
    }

    void installDoors() {
        System.out.println("Installing glass doors");
    }
}

Main.java

public class MainApplication {
    public static void main(String[] args) {
        HouseBuilder woodenHouseBuilder = new WoodenHouseBuilder();
        woodenHouseBuilder.buildHouse();
    }
}

WoodenHouseBuilder အတွက် sequence diagram ကို ကြည့်လိုက်ရင် ရှင်းလင်းသွားပါလိမ့်မယ်။

Pros and Cons

Step တူပြီး Implemention မတူသည့် အခါမှာ template pattern ကို အသုံးပြုနိုင်ပါတယ်။ Code တွေကို ပိုလိုရှင်းလင်း စေပါတယ်။ နောက်ပြီး algorithm တစ်ခုကနေ နောက်တစ်ခုကို ပြောင်းလဲ နိုင်ပါတယ်။

Superclass က code ကိုလည်း ပြန်ပြီး အသုံးပြုနိုင်ပါတယ်။

မကောင်းတာကတော့ Liskov Substitution Principle ကို ချိုးဖောက်နိုင်ပါတယ်။​ တချို့ sub class တွေက မလိုသည့် အဆင့်တွေ ပါလာနိုင်ပါတယ်။

step တွေ များလာလေလေ maintain လုပ်ဖို့ ခက်လေလေပါပဲ။